package com.example.demo.config;

import com.alibaba.fastjson.JSON;
import com.example.demo.contrller.data.ReturnData;
import com.example.demo.demos.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import com.example.demo.utils.TokenUtils;

/**
 * 自定义一个拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {
//    @Override

    @Resource
    RedisTemplate redisTemplate;
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        //如果是映射到方法的直接拦截，即没有在corsconf配置文件中配置通过的接口，
        // 在这里会被拦截，否则放行
        if (handler instanceof HandlerMethod) {//是不是属于拦截的路径
            System.out.println(request.getRequestURL()+"这个方法被拦截");
            //设置请求内容的编码，防止乱码
            response.setContentType("application/json;charset=utf-8");
            response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有域名跨域访问
            response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); // 允许的请求方法
            response.setHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许的请求头

            //从 http 请求头中取出 token
            String token = request.getHeader("token");
            if (token == null || token.equals("")) {//不存在token,则告诉前端需要登录
                PrintWriter out = response.getWriter();
                out.print(JSON.toJSONString(ReturnData.error("该接口需要登录后才能访问")));
                return false;
            }else {//如果存在 ，则表示已经登陆
//实际开发中，通常token是加密的字符串，通过解密方法得到对应的值
// 解密后会含有用户信息和过期时间，要判断有没有这个用户，以及判断这个token有没有过期,和当前时间比较
//                token = "aaa|1701994003835";
                token = TokenUtils.decoder(token);
                if(!token.contains("|")){//判断token有没有|这个符号
                    PrintWriter out = response.getWriter();
                    out.print(JSON.toJSONString(ReturnData.error("token错误")));
                    return false;
                }
                String[] strs = token.split("\\|");//加两个斜杠才能识别是|，把token分割成两部分
//                strs[0] = "aaa";
//                strs[1] = "1701994003835";
                long time = Long.parseLong(strs[1]);//过期时间 Long.parseLong把字符串转化为数字
                long now = System.currentTimeMillis();//当前时间
                //                比较time和now的大小，now大表示没过期，小表示已过期
                if(time<now){
                    PrintWriter out = response.getWriter();
                    out.print("token过期，请重新登录");
                    return false;
                }
                User user = (User) redisTemplate.opsForValue().get(strs[0]);//读缓存
                if(user == null){
                    PrintWriter out = response.getWriter();
                    out.print(JSON.toJSONString(ReturnData.error("用户信息过期，请重新登录")));
                    return false;
                }
                System.out.println(request.getRequestURL()+"这个方法已经登陆，通过本次拦截");
                return true;
            }
        }
        System.out.println(request.getRequestURL()+"这个方法没有被拦截");
//        通过拦截
        return true;

    }
}

